跳到主要内容

1.3.1模块

到现在为止,您已经熟悉了模块的概念,它是一种通过输入和输出端口与外界交互的电路。更大、更复杂的电路是通过组合较小的模块以及其他部分(如assign语句和always块)构建而成的,这些部分相互连接在一起。这样就形成了一种层次结构,因为模块可以包含其他模块的实例。

下图展示了一个带有子模块的非常简单的电路。在这个练习中,请创建一个mod_a模块的实例,然后将该模块的三个引脚(in1、in2和out)连接到顶层模块的三个端口(导线a、b和out)。mod_a模块已为您准备好——您需要对其进行实例化。

在连接模块时,只有模块的端口是重要的。您不需要了解模块内部的代码。mod_a模块的代码看起来像这样:

module mod_a ( input in1, input in2, output out );
// Module body
endmodule

alt text

通过在一个模块内部实例化另一个模块来创建模块的层次结构,只要所使用的全部模块都属于同一个项目(这样编译器才知道在哪里找到该模块)。不同模块的代码并不会写入另一个模块体内部(不同模块的代码不是嵌套的)。

您可以按照端口名称或端口位置将信号连接到模块上。为了额外练习,可以尝试两种方法。

alt text

将信号连接到模块端口

将信号连接到模块端口有两种常用的的方法:按位置连接和按名称连接。

1)按位置连接

通过位置连接导线到端口的语法应该比较熟悉,因为它使用了类似C语言的语法。在实例化一个模块时,端口会根据模块声明从左到右进行连接。例如:

mod_a instance1 ( wa, wb, wc );

这实例化了一个类型为mod_a的模块,并给它命名为"instance1",然后将外部信号wa连接到新模块的第一个端口(in1),wb连接到第二个端口(in2),wc连接到第三个端口(out)。这种语法的一个缺点是,如果模块的端口列表发生改变,所有该模块的实例都需要被找到并相应地修改以匹配新的模块。

2)按名称连接

通过名称将信号连接到模块的端口允许即使端口列表发生变化,导线也能保持正确的连接。然而,这种语法更为冗长。

mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );

上述代码实例化了一个名为"instance2"、类型为mod_a的模块,然后将外部信号wa连接到名为in1的端口,wb连接到名为in2的端口,wc连接到名为out的端口。请注意,在这里端口的顺序是无关紧要的,因为连接会正确地根据端口名称进行,无论其在子模块端口列表中的位置如何。同时注意在这种语法中,端口名称前有一个点号。

模块声明

module top_module ( input a, input b, output out );

做题区